import type { InitialDataType, FlowsType } from "@/hooks/useX6Graph";

/**
 * 获取当前节点的所有输出目标节点ID
 * @param currentWhileNodes - 当前层级的节点数组
 * @returns 扁平化的目标节点ID数组
 * @description 将当前层级所有节点的输出目标节点ID提取并扁平化处理
 */
export const getCurrentNodeOutputs = (currentWhileNodes: InitialDataType) => {
  const arr = currentWhileNodes.map((node) => node.outputs.map((output) => output.targetNode));
  return arr.flat();
};

/**
 * 获取流程的下一层节点，并过滤掉已执行的节点
 * @param data - 所有节点的数据
 * @param flatArr - 当前层节点的输出目标节点ID数组
 * @param flows - 节点执行次数记录
 * @param count - 当前外部循环次数
 * @returns 过滤后的下一层节点数组
 * @description 
 * 1. 根据目标节点ID筛选出下一层节点
 * 2. 过滤掉已经执行过的节点，防止循环节点重复执行
 * 3. 确保每个节点在每个外部循环中最多只执行一次
 */
export const getNextNodes = (
  data: InitialDataType, 
  flatArr: string[], 
  flows: FlowsType, 
  count: number
) => {
  // 根据目标节点ID筛选出下一层节点
  const nextNodes = data.filter((node) => flatArr.includes(node.id));
  
  // 过滤掉已经执行过的节点，防止循环节点额外多执行一次
  return nextNodes.filter((node) => {
    const nodeRunCount = flows[node.id]?.count || 0;
    return nodeRunCount <= count;
  });
};